package satk.objetos;

import java.io.Serializable;
import java.util.Date;
import java.util.Calendar;
import java.util.List;
import satk.beans.interfaces.IntObjetos;

/**
 * Clase para guardar la información de un event
 * @author Sergio Flores Genis <http://sergenis.x10.mx>, 17/04/2011
 */
public class Evento
        implements IntObjetos, Serializable {

    private static final long serialVersionUID = 290421921L;
    private int identificador = -1;
    private String organizador;
    private String nombre;
    private String lugar;
    private Date fechaInicio;
    private Date fechaTermino;
    private Date fechaCierreInscripciones;

    public Evento() {
    }

    public Evento(int identificador, String organizador, String nombre, String lugar,
            Date fechaInicio, Date fechaTermino, Date fechaCierreInscripciones) {
        this.identificador = identificador;
        this.organizador = organizador;
        this.nombre = nombre;
        this.lugar = lugar;
        this.fechaInicio = fechaInicio;
        this.fechaTermino = fechaTermino;
        this.fechaCierreInscripciones = fechaCierreInscripciones;
    }

    // ATRIBUTO: fechaCierreInscripciones
    public Date getFechaCierreInscripciones() {
        return fechaCierreInscripciones;
    }

    public void setFechaCierreInscripciones(Date fechaCierreInscripciones) {
        this.fechaCierreInscripciones = fechaCierreInscripciones;
    }

    // ATRIBUTO: fechaInicio
    public Date getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    // ATRIBUTO: fechaTermino
    public Date getFechaTermino() {
        return fechaTermino;
    }

    public void setFechaTermino(Date fechaTermino) {
        this.fechaTermino = fechaTermino;
    }

    // ATRIBUTO: lugar
    public String getLugar() {
        return lugar;
    }

    public void setLugar(String lugar) {
        this.lugar = lugar;
    }

    // ATRIBUTO: nombre
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // ATRIBUTO: organizador
    public String getOrganizador() {
        return organizador;
    }

    public void setOrganizador(String organizador) {
        this.organizador = organizador;
    }

    // ATRIBUTO: identificador
    @Override
    public Integer getIdentificador() {
        return identificador;
    }

    @Override
    public void setIdentificador(Integer identificador) {
        this.identificador = identificador;
    }

    /**
     * Obtiene el año en el que se realiza el torneo
     * @return Año en el que se realiza
     */
    public int getAnio() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(fechaInicio);
        return cal.get(Calendar.YEAR);
    }

    /**
     * Metodo para obtener el lugar y la fecha del evento en un solo renglón.
     * @return Cadena con el lugar y la fecha.
     */
    public String getLugarYFecha() {
        StringBuilder sLugar = new StringBuilder(lugar.toUpperCase());
        Calendar fi = Calendar.getInstance();
        fi.setTime(fechaInicio);
        Calendar ff = Calendar.getInstance();
        ff.setTime(fechaTermino);

        String fPut = null;
        if (fi.get(Calendar.YEAR) == ff.get(Calendar.YEAR)) {
            if (fi.get(Calendar.MONTH) == ff.get(Calendar.MONTH)) {
                if (fi.get(Calendar.DAY_OF_MONTH) == ff.get(Calendar.DAY_OF_MONTH)) { // Fechas iguales
                    fPut = String.format(", el %1$s",
                            satk.tools.ToolsDate.getFullDate(
                            fi.get(Calendar.DAY_OF_MONTH), fi.get(Calendar.MONTH), fi.get(Calendar.YEAR)));
                } else { // Dia diferente
                    fPut = String.format(", del %1$s al %2$s de %3$s del %4$s",
                            fi.get(Calendar.DAY_OF_MONTH), ff.get(Calendar.DAY_OF_MONTH),
                            satk.tools.ToolsDate.getFullMes(fi.get(Calendar.MONTH)),
                            fi.get(Calendar.YEAR));
                }
            } else { // Meses diferente
                fPut = String.format(", del %1$s al %2$s del %3$s",
                        satk.tools.ToolsDate.getFullDate(fi.get(Calendar.DAY_OF_MONTH), fi.get(Calendar.MONTH)),
                        satk.tools.ToolsDate.getFullDate(ff.get(Calendar.DAY_OF_MONTH), ff.get(Calendar.MONTH)),
                        fi.get(Calendar.YEAR));
            }
        } else { // Año diferente
            fPut = String.format(", del %1$s al %2$s",
                    satk.tools.ToolsDate.getFullDate(fi.get(Calendar.DAY_OF_MONTH), fi.get(Calendar.MONTH), fi.get(Calendar.YEAR)),
                    satk.tools.ToolsDate.getFullDate(ff.get(Calendar.DAY_OF_MONTH), ff.get(Calendar.MONTH), ff.get(Calendar.YEAR)));
        }
        sLugar.append(fPut);
        return sLugar.toString();
    }

    @Override
    public String toString() {
        String format = "EVENTO@[%d;%s]";
        return String.format(format, identificador, nombre);
    }

    @Override
    public Object clon() {
        try {
            return this.clone();
        } catch (CloneNotSupportedException ex) {
        }
        return null;
    }

    @Override
    public List<Throwable> valida() {
        java.util.List<Throwable> list = new java.util.LinkedList<Throwable>();
        if(organizador.isEmpty()){
            list.add(new Throwable("Inique el nombre del organizador"));
        }
        if(nombre.isEmpty()){
            list.add(new Throwable("Ingrese el nombre del evento"));
        }
        if(lugar.isEmpty()){
            list.add(new Throwable("Ingrese lugar donde se realizará el evento"));
        }
        if(fechaInicio.after(fechaTermino)){
            list.add(new Throwable("La fecha de inicio debe ser antes del la de termino"));
        }
        if(fechaCierreInscripciones.after(fechaInicio)){
            list.add(new Throwable("El cierre de inscripciones debe de ser antes de la fecha de inicio"));
        } 
        return list;
    }
}
